package fr.thelem.gestiondemandesthelem.web.commons;

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import fr.thelem.gestiondemandesthelem.dao.model.CPDemandeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CPEtapeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CPParametreEtapeEntity;
import fr.thelem.gestiondemandesthelem.service.IAppliService;

public class SauvegardeXML {

    private IAppliService appliService;

    /**
     * Constructeur
     */
    public SauvegardeXML() {
    }

    /**
     * Accesseur de appliService
     * 
     * @return le appliService
     */
    public IAppliService getAppliService() {
        return appliService;
    }

    /**
     * Affectation de appliService
     * 
     * @param appliService appliService à affecter
     */
    public void setAppliService(IAppliService appliService) {
        this.appliService = appliService;
    }

    public void creerXML(String id) {
        Element racine = new Element("order");
        Document document = new Document(racine);
        int idCPDemande = Integer.valueOf(id);
        CPDemandeEntity demande = appliService.recupererCPDemandeParId(idCPDemande);
        Element params = new Element("params");
        racine.addContent(params);

        /** première élement **/
        Element param1 = new Element("param");
        params.addContent(param1);
        Attribute nom_demande = new Attribute("name", "nom_demande");
        param1.setAttribute(nom_demande);
        Attribute valeur_nom_demande = new Attribute("value", demande.getCDDemandeCPDemande().getNomCDDemande());
        param1.setAttribute(valeur_nom_demande);

        /** second élement **/
        Element param2 = new Element("param");
        params.addContent(param2);
        Attribute environnement = new Attribute("name", "ENVIRONNEMENT");
        param2.setAttribute(environnement);

        /** troisième élement **/
        Element param3 = new Element("param");
        params.addContent(param3);
        Attribute date_traitement = new Attribute("name", "DATE_TRAITEMENT");
        param3.setAttribute(date_traitement);

        /** boucle sur toutes les étapes **/
        int passe = 1;
        for (CPEtapeEntity CPetape : demande.getEtapesCPDemande()) {
            if (CPetape.getCPDemandeCPEtape().getIdentifiantCPDemande() == idCPDemande) {
                for (CPParametreEtapeEntity CPParamEtape : CPetape.getCPParametresEtapeCPEtape()) {
                    if (CPParamEtape.getCDParametreEtape().getNomCDParametreEtape().equalsIgnoreCase("ENVIRONNEMENT")) {
                        Attribute valeur_environnement = new Attribute("value", CPParamEtape.getValeurCPParametreEtape());
                        param2.setAttribute(valeur_environnement);
                    }
                }
                for (CPParametreEtapeEntity CPParamEtape : CPetape.getCPParametresEtapeCPEtape()) {
                    if (CPParamEtape.getCDParametreEtape().getNomCDParametreEtape().equalsIgnoreCase("DATE_TRAITEMENT")) {
                        Attribute valeur_environnement = new Attribute("value", CPParamEtape.getValeurCPParametreEtape());
                        param3.setAttribute(valeur_environnement);
                    }
                }
                for (CPParametreEtapeEntity CPParamEtape : CPetape.getCPParametresEtapeCPEtape()) {
                    if (!CPParamEtape.getCDParametreEtape().getNomCDParametreEtape().equalsIgnoreCase("DATE_TRAITEMENT")
                            && !CPParamEtape.getCDParametreEtape().getNomCDParametreEtape().equalsIgnoreCase("ENVIRONNEMENT")) {

                        if (CPParamEtape.getCDParametreEtape().getTypeSaisieCDParametreEtape().equalsIgnoreCase("user")) {
                            Element param4 = new Element("param");
                            params.addContent(param4);
                            Attribute attname =
                                    new Attribute("name", CPetape.getCDEtapeCPEtape().getNomCDEtape().toUpperCase() + "_"
                                            + CPParamEtape.getCDParametreEtape().getNomCDParametreEtape().toUpperCase() + "_" + passe);
                            param4.setAttribute(attname);
                            Attribute att = new Attribute("value", CPParamEtape.getValeurCPParametreEtape());
                            param4.setAttribute(att);
                        }
                        if (CPParamEtape.getCDParametreEtape().getTypeSaisieCDParametreEtape().equalsIgnoreCase("admin")) {
                            System.out.println(CPParamEtape.getCDParametreEtape().getNomCDParametreEtape());
                            Element param4 = new Element("param");
                            params.addContent(param4);
                            Attribute attname =
                                    new Attribute("name", CPetape.getCDEtapeCPEtape().getNomCDEtape().toUpperCase() + "_"
                                            + CPParamEtape.getCDParametreEtape().getNomCDParametreEtape().toUpperCase() + "_" + passe);
                            param4.setAttribute(attname);
                            Attribute att = new Attribute("value", CPParamEtape.getValeurCPParametreEtape());
                            param4.setAttribute(att);
                        }
                    }
                }
            }
            passe++;
        }

        /** Dernier paramètre **/
        Element paramlast = new Element("run_time");
        params.addContent(paramlast);
        Attribute attribut_last = new Attribute("let_run", "no");
        paramlast.setAttribute(attribut_last);

        SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd");
        Calendar cal = Calendar.getInstance();
        String d = date.format(cal.getTime()).toString();
        String url = demande.getCDDemandeCPDemande().getNomCDDemande() + "," + d + "_" + demande.getTitreCPDemande();
        String emplacement = "/chain/" + demande.getCDDemandeCPDemande().getSousCategorieCDDemande().getCategorieSousCategorie().getNomCategorie() + "/";// a
                                                                                                                                                         // finir
        File thefile = new File(emplacement);
        thefile.mkdirs();
        this.enregistre(document, emplacement + url + ".order.xml");
    }

    void enregistre(Document document, String fichier) {
        try {
            XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fichier);
            sortie.output(document, file);
            file.close();
        } catch (java.io.IOException e) {
        }
    }

}
